#include "ssd1306.h"
#include "stm32f4xx.h"
#include "STM32F4xx_hal_gpio.h"
#include "STM32F4xx_hal_rcc.h"
#include "FreeRTOS.h"
#include "task.h"
#include "ssd1306.h"
#include "globals.h"
#include "main.h"

__IO uint8_t LCD_X,LCD_Y;

void SPI_Write(uint8_t spidata, uint8_t type)
{
	uint8_t i;
	SSD1306_SDIN_PORT->ODR &=~ SSD1306_SDIN_PIN;
	SSD1306_SCLK_PORT->ODR &=~ SSD1306_SCLK_PIN;
	for (i=0;i<9;i=i+1)
	{
		if(i==0)
		{
			if(type == COMAND)
				SSD1306_SDIN_PORT->ODR &=~ SSD1306_SDIN_PIN;
			else
				SSD1306_SDIN_PORT->ODR |= SSD1306_SDIN_PIN;
		}
		else
		{
			if(spidata & 0x80)
				SSD1306_SDIN_PORT->ODR |= SSD1306_SDIN_PIN;
			else
				SSD1306_SDIN_PORT->ODR &=~ SSD1306_SDIN_PIN;
			spidata=spidata<<1;
		}
		SSD1306_SCLK_PORT->ODR  |= SSD1306_SCLK_PIN;
		_delay(10);
		SSD1306_SCLK_PORT->ODR  &=~ SSD1306_SCLK_PIN;
	}
	SSD1306_SDIN_PORT->ODR |= SSD1306_SDIN_PIN;
}

void SSD1306_GPIO_Init(void)
{
	GPIO_InitTypeDef GPIO_InitStruct;
	RCC->SSD1306_RCC_AHB |= SSD1306_RCC_EN;
	// Reset
	GPIO_InitStruct.Pin = SSD1306_RESET_PIN;
	GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
	GPIO_InitStruct.Pull = GPIO_PULLUP;
	GPIO_InitStruct.Speed = GPIO_SPEED_MEDIUM;
	HAL_GPIO_Init(SSD1306_RESET_PORT, &GPIO_InitStruct);
	// CS
	GPIO_InitStruct.Pin = SSD1306_CS_PIN;
	GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
	GPIO_InitStruct.Speed =GPIO_SPEED_MEDIUM;
	GPIO_InitStruct.Pull = GPIO_PULLUP;
	HAL_GPIO_Init(SSD1306_CS_PORT, &GPIO_InitStruct);
	// SCLK
	GPIO_InitStruct.Pin = SSD1306_SCLK_PIN;
	GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
	GPIO_InitStruct.Speed =GPIO_SPEED_MEDIUM;
	GPIO_InitStruct.Pull = GPIO_PULLUP;
	HAL_GPIO_Init(SSD1306_SCLK_PORT, &GPIO_InitStruct);
	// SDIN
	GPIO_InitStruct.Pin = SSD1306_SDIN_PIN;
	GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
	GPIO_InitStruct.Speed =GPIO_SPEED_MEDIUM;
	GPIO_InitStruct.Pull = GPIO_PULLUP;
	HAL_GPIO_Init(SSD1306_SDIN_PORT, &GPIO_InitStruct);
	SSD1306_RESET_PORT->ODR &=~ SSD1306_RESET_PIN;
	_delay(100);
	SSD1306_RESET_PORT->ODR |= SSD1306_RESET_PIN;
	SSD1306_CS_PORT->ODR |=SSD1306_CS_PIN;
	SSD1306_SCLK_PORT->ODR &=~SSD1306_SCLK_PIN;
	SSD1306_SDIN_PORT->ODR |= SSD1306_SDIN_PIN;
}

void SSD1306_Init(void)
{
	LCD_Commmand(COMAND, SSD1306_DISPLAYOFF);                   // 0xAE
	LCD_Commmand(COMAND,SSD1306_SETDISPLAYCLOCKDIV);            // 0xD5
	LCD_Commmand(COMAND,0x80);                                  // the suggested ratio 0x80
	LCD_Commmand(COMAND,SSD1306_SETMULTIPLEX);                  // 0xA8
	LCD_Commmand(COMAND,0x3F);
	LCD_Commmand(COMAND,SSD1306_SETDISPLAYOFFSET);              // 0xD3
	LCD_Commmand(COMAND,0x0);                                   // no offset
	LCD_Commmand(COMAND,SSD1306_SETSTARTLINE | 0x0);            // line #0
	LCD_Commmand(COMAND,SSD1306_CHARGEPUMP);                    // 0x8D
	LCD_Commmand(COMAND,0x14);
	LCD_Commmand(COMAND,SSD1306_MEMORYMODE);                    // 0x20
	LCD_Commmand(COMAND,0x00);                                  // 0x0 act like ks0108
	LCD_Commmand(COMAND,SSD1306_SEGREMAP | 0x1);
	LCD_Commmand(COMAND,SSD1306_COMSCANDEC);
	LCD_Commmand(COMAND,SSD1306_SETCOMPINS);                    // 0xDA
	LCD_Commmand(COMAND,0x12);
	LCD_Commmand(COMAND,SSD1306_SETCONTRAST);                   // 0x81
	LCD_Commmand(COMAND,0xCF);
	LCD_Commmand(COMAND,SSD1306_SETPRECHARGE);                  // 0xd9
	LCD_Commmand(COMAND,0xF1);
	LCD_Commmand(COMAND,SSD1306_SETVCOMDETECT);                 // 0xDB
	LCD_Commmand(COMAND,0x40);
	LCD_Commmand(COMAND,SSD1306_DISPLAYALLON_RESUME);           // 0xA4
	LCD_Commmand(COMAND,SSD1306_NORMALDISPLAY);                 // 0xA6
	LCD_Commmand(COMAND,SSD1306_DISPLAYON);						//--turn on oled panel
}

void LCD_Commmand(uint8_t ControByte, uint8_t DataByte)
{
	SSD1306_CS_PORT->ODR &=~ SSD1306_CS_PIN;
	SPI_Write(DataByte, ControByte);
	SSD1306_CS_PORT->ODR |= SSD1306_CS_PIN;
}

void LCD_draw8x8(uint8_t * buffer, uint8_t x, uint8_t y)
{
	LCD_Goto(x,y);
	for (x=0; x<8; x++)
		LCD_Commmand(DATA, buffer[x]);
}

void LCD_Print(char c)
{
	if((c>=0xE0)&&(c<0xE0 +0x20))
		c = c - 0x40;
	else
		if((c>=0xC0)&&(c<0xE0))
			c = c - 0x40;
	LCD_draw8x8((uint8_t*)&LCD_Buffer[c-32],LCD_X,LCD_Y);
	LCD_X += 8;
	if(LCD_X>SSD1306_LCDWIDTH)
	{
		LCD_X =SSD1306_DEFAULT_SPACE;
		LCD_Y ++;
	}
}

void LCD_Printf(char* buf)
{
	while (*buf!=0)
	{
		if(LCD_X>SSD1306_LCDWIDTH) {
			LCD_X=SSD1306_DEFAULT_SPACE;
			LCD_Y ++;
		}
		if(LCD_X < 5)
			LCD_X=SSD1306_DEFAULT_SPACE;
		LCD_Print(*buf++);
	}
}

void LCD_Goto(uint8_t x, uint8_t y)
{
	LCD_X = x;
	LCD_Y = y;
	// send a bunch of data in one xmission
	LCD_Commmand(COMAND, 0xB0 + y);//set page address
	LCD_Commmand(COMAND, x & 0xf);//set lower column address
	LCD_Commmand(COMAND,0x10 | (x >> 4));//set higher column address
}

void LCD_Clear(uint8_t x, uint8_t y, uint8_t count)
{
	LCD_Goto(x,y);
	while(count != 0)
	{
		LCD_Print(' ');
		count --;
	}
}

void LCD_ClearFull(void)
{
	uint16_t i;
	uint16_t x=0;
	uint16_t y=0;
	LCD_Goto(0,0);

	for (i=0; i<=((SSD1306_LCDWIDTH/5)*(SSD1306_LCDHEIGHT/8)); i++)
	{
		LCD_Print(' ');
		x ++;
		if(x>(SSD1306_LCDWIDTH/5))
		{
			x =0;
			y++;
			LCD_Goto(0,y);
		}
	}
	LCD_X =SSD1306_DEFAULT_SPACE;
	LCD_Y =0;
}

void LCD_DrawImageFullScreen(uint8_t * buf)
{
	uint16_t i;
	uint8_t x=0;
	uint8_t y=0;
	LCD_Goto(0,0);
	for (i=0; i<(SSD1306_LCDWIDTH*SSD1306_LCDHEIGHT/8); i++)
	{
		LCD_Commmand(DATA, buf[i]);
		x++;
		if(x>=SSD1306_LCDWIDTH)
		{
			x =0;
			y++;
			LCD_Goto(0,y);
		}
	}
}

const uint8_t LCD_Buffer[][22] = {
		{0x00, 0x00, 0x00, 0x00, 0x00},// (space)
		{0x00, 0x00, 0x5F, 0x00, 0x00},// !
		{0x00, 0x07, 0x00, 0x07, 0x00},// "
		{0x14, 0x7F, 0x14, 0x7F, 0x14},// #
		{0x24, 0x2A, 0x7F, 0x2A, 0x12},// $
		{0x23, 0x13, 0x08, 0x64, 0x62},// %
		{0x36, 0x49, 0x55, 0x22, 0x50},// &
		{0x00, 0x05, 0x03, 0x00, 0x00},// '
		{0x00, 0x1C, 0x22, 0x41, 0x00},// (
		{0x00, 0x41, 0x22, 0x1C, 0x00},// )
		{0x08, 0x2A, 0x1C, 0x2A, 0x08},// *
		{0x08, 0x08, 0x3E, 0x08, 0x08},// +
		{0x00, 0x50, 0x30, 0x00, 0x00},// ,
		{0x08, 0x08, 0x08, 0x08, 0x08},// -
		{0x00, 0x30, 0x30, 0x00, 0x00},// .
		{0x20, 0x10, 0x08, 0x04, 0x02},// /
		{0x3E, 0x51, 0x49, 0x45, 0x3E},// 0
		{0x00, 0x42, 0x7F, 0x40, 0x00},// 1
		{0x42, 0x61, 0x51, 0x49, 0x46},// 2
		{0x21, 0x41, 0x45, 0x4B, 0x31},// 3
		{0x18, 0x14, 0x12, 0x7F, 0x10},// 4
		{0x27, 0x45, 0x45, 0x45, 0x39},// 5
		{0x3C, 0x4A, 0x49, 0x49, 0x30},// 6
		{0x01, 0x71, 0x09, 0x05, 0x03},// 7
		{0x36, 0x49, 0x49, 0x49, 0x36},// 8
		{0x06, 0x49, 0x49, 0x29, 0x1E},// 9
		{0x00, 0x36, 0x36, 0x00, 0x00},// :
		{0x00, 0x56, 0x36, 0x00, 0x00},// ;
		{0x00, 0x08, 0x14, 0x22, 0x41},// <
		{0x14, 0x14, 0x14, 0x14, 0x14},// =
		{0x41, 0x22, 0x14, 0x08, 0x00},// >
		{0x02, 0x01, 0x51, 0x09, 0x06},// ?
		{0x32, 0x49, 0x79, 0x41, 0x3E},// @
		{0x7E, 0x11, 0x11, 0x11, 0x7E},// A
		{0x7F, 0x49, 0x49, 0x49, 0x36},// B
		{0x3E, 0x41, 0x41, 0x41, 0x22},// C
		{0x7F, 0x41, 0x41, 0x22, 0x1C},// D
		{0x7F, 0x49, 0x49, 0x49, 0x41},// E
		{0x7F, 0x09, 0x09, 0x01, 0x01},// F
		{0x3E, 0x41, 0x41, 0x51, 0x32},// G
		{0x7F, 0x08, 0x08, 0x08, 0x7F},// H
		{0x00, 0x41, 0x7F, 0x41, 0x00},// I
		{0x20, 0x40, 0x41, 0x3F, 0x01},// J
		{0x7F, 0x08, 0x14, 0x22, 0x41},// K
		{0x7F, 0x40, 0x40, 0x40, 0x40},// L
		{0x7F, 0x02, 0x04, 0x02, 0x7F},// M
		{0x7F, 0x04, 0x08, 0x10, 0x7F},// N
		{0x3E, 0x41, 0x41, 0x41, 0x3E},// O
		{0x7F, 0x09, 0x09, 0x09, 0x06},// P
		{0x3E, 0x41, 0x51, 0x21, 0x5E},// Q
		{0x7F, 0x09, 0x19, 0x29, 0x46},// R
		{0x46, 0x49, 0x49, 0x49, 0x31},// S
		{0x01, 0x01, 0x7F, 0x01, 0x01},// T
		{0x3F, 0x40, 0x40, 0x40, 0x3F},// U
		{0x1F, 0x20, 0x40, 0x20, 0x1F},// V
		{0x7F, 0x20, 0x18, 0x20, 0x7F},// W
		{0x63, 0x14, 0x08, 0x14, 0x63},// X
		{0x03, 0x04, 0x78, 0x04, 0x03},// Y
		{0x61, 0x51, 0x49, 0x45, 0x43},// Z
		{0x00, 0x00, 0x7F, 0x41, 0x41},// [
		{0x02, 0x04, 0x08, 0x10, 0x20},// "\"
		{0x41, 0x41, 0x7F, 0x00, 0x00},// ]
		{0x04, 0x02, 0x01, 0x02, 0x04},// ^
		{0x40, 0x40, 0x40, 0x40, 0x40},// _
		{0x00, 0x01, 0x02, 0x04, 0x00},// `
		{0x20, 0x54, 0x54, 0x54, 0x78},// a
		{0x7F, 0x48, 0x44, 0x44, 0x38},// b
		{0x38, 0x44, 0x44, 0x44, 0x20},// c
		{0x38, 0x44, 0x44, 0x48, 0x7F},// d
		{0x38, 0x54, 0x54, 0x54, 0x18},// e
		{0x08, 0x7E, 0x09, 0x01, 0x02},// f
		{0x08, 0x14, 0x54, 0x54, 0x3C},// g
		{0x7F, 0x08, 0x04, 0x04, 0x78},// h
		{0x00, 0x44, 0x7D, 0x40, 0x00},// i
		{0x20, 0x40, 0x44, 0x3D, 0x00},// j
		{0x00, 0x7F, 0x10, 0x28, 0x44},// k
		{0x00, 0x41, 0x7F, 0x40, 0x00},// l
		{0x7C, 0x04, 0x18, 0x04, 0x78},// m
		{0x7C, 0x08, 0x04, 0x04, 0x78},// n
		{0x38, 0x44, 0x44, 0x44, 0x38},// o
		{0x7C, 0x14, 0x14, 0x14, 0x08},// p
		{0x08, 0x14, 0x14, 0x18, 0x7C},// q
		{0x7C, 0x08, 0x04, 0x04, 0x08},// r
		{0x48, 0x54, 0x54, 0x54, 0x20},// s
		{0x04, 0x3F, 0x44, 0x40, 0x20},// t
		{0x3C, 0x40, 0x40, 0x20, 0x7C},// u
		{0x1C, 0x20, 0x40, 0x20, 0x1C},// v
		{0x3C, 0x40, 0x30, 0x40, 0x3C},// w
		{0x44, 0x28, 0x10, 0x28, 0x44},// x
		{0x0C, 0x50, 0x50, 0x50, 0x3C},// y
		{0x44, 0x64, 0x54, 0x4C, 0x44},// z
		{0x00, 0x08, 0x36, 0x41, 0x00},// {
		{0x00, 0x00, 0x7F, 0x00, 0x00},// |
		{0x00, 0x41, 0x36, 0x08, 0x00},// }
		{0x02, 0x01, 0x02, 0x04, 0x02},// ~
		{0x08, 0x1C, 0x2A, 0x08, 0x08},// <-
		//
		{ 0x7E, 0x11, 0x11, 0x11, 0x7E },  // �
		{ 0x7F, 0x49, 0x49, 0x49, 0x33 },  // �
		{ 0x7F, 0x49, 0x49, 0x49, 0x36 },  // �
		{ 0x7F, 0x01, 0x01, 0x01, 0x03 },  // �
		{ 0xE0, 0x51, 0x4F, 0x41, 0xFF },  // �
		{ 0x7F, 0x49, 0x49, 0x49, 0x49 },  // �
		{ 0x77, 0x08, 0x7F, 0x08, 0x77 },  // �
		{ 0x49, 0x49, 0x49, 0x49, 0x36 },  // �
		{ 0x7F, 0x10, 0x08, 0x04, 0x7F },  // �
		{ 0x7C, 0x21, 0x12, 0x09, 0x7C },  // �
		{ 0x7F, 0x08, 0x14, 0x22, 0x41 },  // �
		{ 0x20, 0x41, 0x3F, 0x01, 0x7F },  // �
		{ 0x7F, 0x02, 0x0C, 0x02, 0x7F },  // �
		{ 0x7F, 0x08, 0x08, 0x08, 0x7F },  // �
		{ 0x3E, 0x41, 0x41, 0x41, 0x3E },  // �
		{ 0x7F, 0x01, 0x01, 0x01, 0x7F },  // �
		{ 0x7F, 0x09, 0x09, 0x09, 0x06 },  // �
		{ 0x3E, 0x41, 0x41, 0x41, 0x22 },  // �
		{ 0x01, 0x01, 0x7F, 0x01, 0x01 },  // �
		{ 0x27, 0x48, 0x48, 0x48, 0x3F },  // �
		{ 0x1C, 0x22, 0x7F, 0x22, 0x1C },  // �
		{ 0x63, 0x14, 0x08, 0x14, 0x63 },  // �
		{ 0x7F, 0x40, 0x40, 0x40, 0xFF },  // �
		{ 0x07, 0x08, 0x08, 0x08, 0x7F },  // �
		{ 0x7F, 0x40, 0x7F, 0x40, 0x7F },  // �
		{ 0x7F, 0x40, 0x7F, 0x40, 0xFF },  // �
		{ 0x01, 0x7F, 0x48, 0x48, 0x30 },  // �
		{ 0x7F, 0x48, 0x30, 0x00, 0x7F },  // �
		{ 0x7F, 0x48, 0x48, 0x30, 0x00 },  // �
		{ 0x22, 0x41, 0x49, 0x49, 0x3E },  // �
		{ 0x7F, 0x08, 0x3E, 0x41, 0x3E },  // �
		{ 0x46, 0x29, 0x19, 0x09, 0x7F },  // �
		{ 0x20, 0x54, 0x54, 0x54, 0x78 },  // �
		{ 0x3C, 0x4A, 0x4A, 0x49, 0x31 },  // �
		{ 0x7C, 0x54, 0x54, 0x28, 0x00 },  // �
		{ 0x7C, 0x04, 0x04, 0x04, 0x0C },  // �
		{ 0xE0, 0x54, 0x4C, 0x44, 0xFC },  // �
		{ 0x38, 0x54, 0x54, 0x54, 0x08 },  // �
		{ 0x6C, 0x10, 0x7C, 0x10, 0x6C },  // �
		{ 0x44, 0x44, 0x54, 0x54, 0x28 },  // �
		{ 0x7C, 0x20, 0x10, 0x08, 0x7C },  // �
		{ 0x78, 0x42, 0x24, 0x12, 0x78 },  // �
		{ 0x7C, 0x10, 0x28, 0x44, 0x00 },  // �
		{ 0x20, 0x44, 0x3C, 0x04, 0x7C },  // �
		{ 0x7C, 0x08, 0x10, 0x08, 0x7C },  // �
		{ 0x7C, 0x10, 0x10, 0x10, 0x7C },  // �
		{ 0x38, 0x44, 0x44, 0x44, 0x38 },  // �
		{ 0x7C, 0x04, 0x04, 0x04, 0x7C },  // �
		{ 0x7C, 0x14, 0x14, 0x14, 0x08 },  // �
		{ 0x38, 0x44, 0x44, 0x44, 0x44 },  // �
		{ 0x04, 0x04, 0x7C, 0x04, 0x04 },  // �
		{ 0x0C, 0x50, 0x50, 0x50, 0x3C },  // �
		{ 0x18, 0x24, 0x7E, 0x24, 0x18 },  // �
		{ 0x44, 0x28, 0x10, 0x28, 0x44 },  // �
		{ 0x7C, 0x40, 0x40, 0x40, 0xFC },  // �
		{ 0x0C, 0x10, 0x10, 0x10, 0x7C },  // �
		{ 0x7C, 0x40, 0x7C, 0x40, 0x7C },  // �
		{ 0x7C, 0x40, 0x7C, 0x40, 0xFC },  // �
		{ 0x04, 0x7C, 0x50, 0x50, 0x20 },  // �
		{ 0x7C, 0x50, 0x20, 0x00, 0x7C },  // �
		{ 0x7C, 0x50, 0x50, 0x20, 0x00 },  // �
		{ 0x28, 0x44, 0x54, 0x54, 0x38 },  // �
		{ 0x7C, 0x10, 0x38, 0x44, 0x38 },  // �
		{ 0x08, 0x54, 0x34, 0x14, 0x7C }   // �
};

const uint8_t OLED_Logo [] =
{
		0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
		0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x08, 0x18, 0x08, 0x00, 0x80, 0xC0, 0xC0, 0x00, 0x0C, 0x04, 0x00, 0x00, 0x00, 0x40, 0xE0, 0xE0, 0x62, 0x63, 0x03, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
		0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x40, 0x40, 0x00, 0x00, 0x03, 0x03, 0x60, 0x60, 0x60, 0x03, 0x03, 0x03, 0x01, 0x00, 0x70, 0x70, 0x70, 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x70, 0x70, 0x78, 0x38, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
		0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x70, 0x70, 0x30, 0x00, 0x00, 0x00, 0x70, 0x70, 0x70, 0x30, 0x00, 0x00, 0x00, 0x00, 0x30, 0x70, 0x78, 0x38, 0x38, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x70, 0x78, 0x78, 0x7C, 0x3C, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
		0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xE0, 0xE0, 0xE0, 0xE0, 0xE0, 0xE0, 0xE0, 0xE0, 0xC0, 0xC0, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xE0, 0xE0, 0x00, 0x00, 0x00, 0xE0, 0xE0, 0xE0, 0x00, 0x00, 0x00, 0xC0, 0xC0, 0xE0, 0xE0, 0xE0, 0xE0, 0xE0, 0xC0, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
		0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0x70, 0x70, 0xF0, 0xF0, 0xF0, 0x3F, 0x3F, 0x1F, 0x00, 0x00, 0xC0, 0xF0, 0xF8, 0x1C, 0x0C, 0x0C, 0x1C, 0x3C, 0xF8, 0xF0, 0xC0, 0x00, 0x00, 0xFC, 0xFC, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x02, 0x1F, 0x3F, 0x38, 0x38, 0x70, 0x70, 0xF1, 0xE3, 0xC3, 0xC2, 0x00, 0x0C, 0x7C, 0xFC, 0xF0, 0x00, 0x00, 0xE0, 0xFC, 0xFC, 0x0C, 0x00, 0x00, 0xF8, 0xFC, 0xCC, 0xCC, 0xCC, 0x9C, 0x9C, 0x10, 0x00, 0x00, 0x0C, 0xFF, 0xFF, 0x0C, 0x0C, 0x00, 0x80, 0xF0, 0xF8, 0x9C, 0x8C, 0x8C, 0x9C, 0xF8, 0xF0, 0x00, 0x00, 0x00, 0xFC, 0xFC, 0x18, 0x0C, 0x0C, 0x3C, 0xFC, 0xF8, 0x38, 0x0C, 0x0C, 0x1C, 0xFC, 0xF8, 0x00, 0x00, 0x20, 0xF8, 0xFC, 0xCC, 0xCC, 0xCC, 0x9C, 0x98, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
		0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0x3F, 0x3F, 0x00, 0x00, 0x00, 0x01, 0x07, 0x3F, 0x3E, 0x3C, 0x20, 0x00, 0x07, 0x0F, 0x1F, 0x38, 0x38, 0x30, 0x38, 0x38, 0x1F, 0x0F, 0x03, 0x00, 0x00, 0x3F, 0x3F, 0x00, 0x00, 0x00, 0x3F, 0x3F, 0x3F, 0x00, 0x00, 0x06, 0x1E, 0x3E, 0x38, 0x38, 0x38, 0x38, 0x38, 0x3F, 0x1F, 0x0F, 0x00, 0x00, 0x00, 0x03, 0x1F, 0xFE, 0xFC, 0x3F, 0x07, 0x00, 0x00, 0x00, 0x00, 0x1C, 0x3D, 0x31, 0x31, 0x33, 0x3B, 0x3F, 0x1F, 0x00, 0x00, 0x00, 0x3F, 0x3F, 0x38, 0x30, 0x00, 0x01, 0x1F, 0x3F, 0x39, 0x31, 0x31, 0x39, 0x39, 0x19, 0x00, 0x00, 0x00, 0x3F, 0x3F, 0x00, 0x00, 0x00, 0x00, 0x3F, 0x3F, 0x00, 0x00, 0x00, 0x00, 0x3F, 0x3F, 0x00, 0x00, 0x08, 0x18, 0x3D, 0x31, 0x31, 0x33, 0x3B, 0x3F, 0x1F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
		0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0x07, 0x07, 0x03, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
};

const uint8_t OLED_USB_mode[] =
{
		0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x80, 0x80, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
		0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x80, 0x80, 0x80, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0xC0, 0x60, 0x30, 0x18, 0x0C, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x07, 0x0F, 0x1F, 0x1F, 0x1F, 0x0F, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
		0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x38, 0xFE, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x7C, 0x38, 0x10, 0x10, 0x10, 0x10, 0x10, 0x18, 0x18, 0x1E, 0x1F, 0x13, 0x11, 0x10, 0x10, 0x10, 0x30, 0x70, 0xF0, 0xB0, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x38, 0x7C, 0x7C, 0x38, 0x38, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
		0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x03, 0x03, 0x03, 0x03, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x03, 0x0E, 0x0C, 0x38, 0x30, 0x60, 0xC0, 0xC0, 0xC0, 0xC0, 0xC0, 0xC0, 0xC0, 0xC0, 0xF0, 0xF0, 0xF0, 0xF0, 0xF0, 0xF0, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
		0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
		0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFC, 0xFC, 0xFC, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFC, 0xFC, 0xFC, 0xFC, 0x00, 0x00, 0x40, 0xF0, 0xF8, 0xF8, 0x0C, 0x0C, 0x0C, 0x08, 0x08, 0x08, 0x18, 0x00, 0x00, 0x00, 0x00, 0xFC, 0xFC, 0xFC, 0xFC, 0x0C, 0x0C, 0x0C, 0xF8, 0xF8, 0xF8, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xC0, 0xC0, 0xC0, 0xC0, 0x00, 0x80, 0x80, 0xC0, 0x80, 0x80, 0x00, 0x00, 0x80, 0xC0, 0xC0, 0x80, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x80, 0x80, 0xC0, 0xC0, 0x80, 0x80, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x80, 0xC0, 0x80, 0x80, 0x00, 0xFC, 0xFC, 0xFC, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x80, 0x80, 0x80, 0xC0, 0xC0, 0x80, 0x80, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
		0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0x7F, 0xFF, 0xFF, 0x80, 0x80, 0x80, 0x80, 0x80, 0xFF, 0xFF, 0x7F, 0x0F, 0x00, 0x00, 0xC0, 0xC1, 0x83, 0x83, 0x83, 0x87, 0x87, 0x86, 0xFE, 0xFE, 0x7C, 0x10, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0x83, 0x83, 0x83, 0x83, 0xFF, 0xFC, 0x7C, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFC, 0x00, 0x00, 0x08, 0x7F, 0xFF, 0xFF, 0x80, 0x80, 0x80, 0x80, 0xFF, 0xFF, 0x7F, 0x08, 0x00, 0x00, 0x08, 0x7F, 0xFF, 0xFF, 0x80, 0x80, 0x80, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x08, 0x7F, 0xFF, 0xFF, 0x8C, 0x8C, 0x8C, 0x8C, 0x8F, 0x8F, 0x8F, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
		0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x01, 0x01, 0x00, 0x00, 0x00, 0x01, 0x01, 0x01, 0x01, 0x00, 0x00, 0x00, 0x01, 0x01, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x01, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
};
